<?php
App::import('Sanitize');
class UsuariosController extends AppController {

	var $name = 'Usuarios';
	var $uses = array('Usuario', 'Interese');
	var $components = array('Email');
	
	var $actsAs = array('Acl' => array('requester'));
	
	function beforeFilter(){
		parent::beforeFilter();
		$this->Auth->allowedActions = array('*');
	}
	
	/**
	 * Mantener las listas de acceso (Acl)
	 */
	function parentNode() {
		if (!$this->id && empty($this->data)) {
			return null;
		}
		$data = $this->data;
		if (empty($this->data)) {
			$data = $this->read();
		}
		if (!$data['Ususario']['permiso_id']) {
			return null;
		} else {
			return array('Permiso' => array('id' => $data['Usuario']['permiso_id']));
		}
	}

	function index() {
		
	}

/**
	 * Panel de control de usuario
	 * @param string $id
	 */
	function view($id = null) {
		if ($id == null) {
			$useraux = $this->Auth->user();
			$id = $useraux['Usuario']['id'];
		}
		$this->layout = 'perfil_layout';
		if (!$id) {
			$this->Session->setFlash(__('Usuario erróneo', true));
			$this->redirect(array('action' => 'index'));
		}
		$this->set('usuario', $this->Usuario->read(null, $id));
	}

	function registro($id = null){
		$paises = $this->Usuario->Paise->find('list');
		$provincias = $this->Usuario->Provincia->find('list');
		$conocios = $this->Usuario->Conocio->find('list');
		$this->set(compact('paises', 'provincias', 'conocios'));
		
		if ($id != null) {
			$this->Usuario->id = $id;
			if ($this->Usuario->save($this->data)) {
				$this->redirect(array('controller' => 'usuarioVips', 'action' => 'registro_vip'));
			}
		}
		if (!empty($this->data)) {
			if (!isset($this->data['Usuario']['pass'])) {
				return false;
			}
			if (!$this->data['Usuario']['condiciones']) {
				$this->Session->setFlash(__('Debes aceptar las condiciones de DULCISSIMAS', true));
				$this->data['Usuario']['pass'] = '';
				return false;
			}
			$exito = __('<p>Te has registrado satisfactoriamente</p>'.
				'<p>En breve recibirás un correo electrónico de Dulcissimas, '.
				'accede a él y pulsa en el enlace para validar tu cuenta</p>', true);
			if ($this->data['Usuario']['pass'] == $this->Auth->password($this->data['Usuario']['pass_confirm']) && strlen($this->data['Usuario']['pass_confirm']) > 3) {
				$vcode = $this->genPass(60);
				$this->data['Usuario']['validacion'] = 'v...' . $vcode;
				$this->Usuario->create();
				if ($this->Usuario->save($this->data)) {
					$this->_setActivationMail($this->Usuario->id);
					$this->Session->setFlash($exito);
					$this->redirect(array('action' => 'index'));
				} else {
					$this->Session->setFlash(__('Ocurrió algún error al guardar tus datos. Por favor, inténtalo de nuevo.', true));
				}
			} else {
				$this->Session->setFlash(__('Introduce y confirma tu contraseña correctamente', true));
			}
		}
		$this->data['Usuario']['pass'] = '';
	}

	function add() {
		$this->redirect(array('action' => 'registro'));
	}

	function edit($id = null, $redirect = null) {
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Usuario erróneo', true));
		}
		$target = ($redirect == null) ? 'view' : 'index';
		if (!empty($this->data)) {
			$this->Usuario->id = $id;
			if ($this->Usuario->save($this->data, true, array('nombre', 'apellidos', 'fecha_nac', 'sexo', 'paise_id', 'provincia_id', 'phone', 'direccion', 'interese_id'))) {
				$this->Session->setFlash(__('El usuario se ha modificado', true));
				$this->redirect(array('action' => $target));
			} else {
				$this->Session->setFlash(__('El usuario no ha podido ser modificado. Por favor, inténtelo de nuevo', true));
			}
		}
		if (empty($this->data)) {
			$this->data = $this->Usuario->read(null, $id);
		}
		$paises = $this->Usuario->Paise->find('list');
		$provincias = $this->Usuario->Provincia->find('list');
		$intereses = $this->Usuario->Interese->find('list');
		$this->set(compact('paises', 'provincias', 'intereses'));
		$this->layout = 'perfil_layout';
	}
	
	function edit_pass($id = null) {
		$this->layout = 'perfil_layout';
		if (empty($this->data)) {
			return false;
		}
		if ($id == null) {
			$useraux = $this->Auth->user();
			$id = $useraux['Usuario']['id'];
		}
		$this->Usuario->id = $id;
		$oldpass = $this->Auth->password($this->data['Usuario']['oldpass']);
		$this->data['Usuario']['pass'] = $this->Auth->password($this->data['Usuario']['newpass']);
		$newpass = $this->data['Usuario']['newpass'];
		$newpass_confirm = $this->data['Usuario']['newpass_confirm'];
		$user = $this->Usuario->find('first', array('conditions' => array('id' => $id), 'recursive' => -1, 'fields' => array('Usuario.pass')));
		if ($oldpass == $user['Usuario']['pass']) {
			if (($newpass == $newpass_confirm) && $newpass) {
				$newpass = $this->Auth->password($newpass);
				if ($this->Usuario->save($this->data, true, array('pass'))) {
					$this->Session->setFlash(__('La contraseña ha sido modificada correctamente', true));
					$this->redirect(array('action' => 'view'));
				}
				$this->Session->setFlash(__('Ocurrió algún problema al editar la contraseña. Por favor, inténtalo de nuevo.', true));
			} else {
				$this->Session->setFlash(__('Confirme su contraseña, por favor.', true));
			}
		} else {
			$this->Session->setFlash(__('Introduzca su contraseña actual para poder modificarla', true));
		}
	}
	
	/**
	 * Usuario actualmente autenticado
	 * @param mixed $show: campo a obtener de ese usuario, si $show == null, devuelve un array
	 */
	function current_user($show = null){
		if ($show == null) {
			return $this->Auth->user();
		} else {
			return $this->Auth->user($show);
		}
	}
	
	/**
	 * Es un current_user con la excepción de que captura el nombre si está disponible, sino el mail.
	 * Si el usuario no está autenticado, retorna falso.
	 */
	function login_panel_check() {
		$user = $this->Auth->user();
		if ($user) {
			if ($user['Usuario']['nombre']) {
				return $user['Usuario']['nombre'];
			} else {
				return $user['Usuario']['mail'];
			}
		} else {
			return false;
		}
	}
	
	function login(){
		
	}
	
	function logout(){
		$this->redirect($this->Auth->logout());
	}
	
	/**
	 * Seleccionar entre bloquear una cuenta o eliminarla completamente
	 */
	function opciones_de_cuenta($id=null) {
		$this->layout = 'perfil_layout';
		if ($id == null) {
			$this->Session->setFlash('Usuario erróneo');
			$this->redirect(array('action' => 'view'));
		}
		$this->set('user', $id);
	}
	
	function bloquear_cuenta ($id = null) {
		if ($id == null) {
			$this->Session->setFlash('Usuario erróneo');
			$this->redirect(array('action' => 'view'));
		}
		if ($this->Usuario->UpdateAll(array('Usuario.activo' => '0'), array('Usuario.id' => $id))) {
			$this->_setActivationMail($id);
			$this->Session->setFlash(__('Tu cuenta ha sido desactivada. Puedes regresar siguiendo los pasos del correo electrónico que recibirás en breve', true));
			$this->redirect(array('action' => 'logout'));
		} else {
			$this->Session->setFlash(__('Ocurrió algún error al desactivar tu cuenta. Por favor, inténtalo de nuevo.', true));
		}
	}
	
	function _setActivationMail($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Usuario erróneo', true));
			$this->redirect (array('controller' => 'pages', 'action' => 'display'));
		}
		$user = $this->Usuario->read(null, $id);
		$this->Email->to = $user['Usuario']['mail'];
		$this->Email->bcc = array('info@dulcissimas.com');
		$this->Email->subject = 'Bienvenido a DULCISSIMAS. Models & Events';
		$this->Email->replyTo = 'info@dulcissimas.com';
		$this->Email->from = 'DULCISSIMAS. Models & Events <info@dulcissimas.com>';
		$this->Email->additionalParams = '-fwebmaster@dulcissimas.com';
		$this->Email->template = 'activation_mail';
		$this->Email->sendAs = 'html';
		$this->set('user', $user);
		$this->Email->send();
	}
	
	function admin_index() {
		$this->layout = 'admin_layout';
		$this->Usuario->recursive = 0;
		$this->set('usuarios', $this->paginate('Usuario'));
	}
	
	/**
	 * Panel de control de admin para usuarios
	 * @param string $id
	 */
	function admin_view($id = null) {
		$this->view($id);
		$this->layout = 'admin_layout';
	}
	
	function admin_edit($id = null) {
		$this->edit($id, 'admin');
		$this->layout = 'admin_layout';
	}

	function admin_delete($id = null) {
		$this->layout = 'admin_layout';
		if (!$id) {
			$this->Session->setFlash(__('Usuario erróneo', true));
			$this->redirect(array('action' => 'admin_index'));
		}
		if ($this->Usuario->delete($id)) {
			$this->Session->setFlash(__('Usuario eliminado', true));
			$this->redirect(array('action' => 'admin_index'));
		}
		$this->Session->setFlash(__('El usuario no pudo ser eliminado', true));
		$this->redirect(array('action' => 'admin_index'));
	}
	
	function admin_activar($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Usuario erróneo', true));
			$this->redirect(array('action' => 'index'));
		}
		if ($this->Usuario->updateAll(array('Usuario.activo' => '1'), array('Usuario.id' => $id))) {
			$this->Session->setFlash(__('El usuario se ha activado correctamente', true));
		} else {
			$this->Session->setFlash(__('Ocurrió algún problema al activar el usuario. Por favor, inténtalo de nuevo.', true));
		}
		$this->layout = 'admin_layout';
		$this->redirect(array('action' => 'index'));
	}
	
	function admin_desactivar($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Usuario erróneo', true));
			$this->redirect(array('action' => 'index'));
		}
		if ($this->Usuario->updateAll(array('Usuario.activo' => '0'), array('Usuario.id' => $id))) {
			$this->Session->setFlash(__('El usuario se ha desactivado correctamente', true));
		} else {
			$this->Session->setFlash(__('Ocurrió algún problema al desactivar el usuario. Por favor, inténtalo de nuevo.', true));
		}
		$this->layout = 'admin_layout';
		$this->redirect(array('action' => 'index'));
	}
	
	/**
	 * Recuperar contraseña, haciendo uso de Tickets
	 * @param string $email
	 */
	function resetpassword($email = null) {
		//grab a fresh botcheck question from the db
		//for this example you'll need to static code these,
		//my botcheck article is coming soon though
		//$bc=$this->Botcheck->getFreshBotcheck();
		$this->whatWeAsk = "¿El agua es líquida a temperatura ambiente?";
		$this->humanWouldType = array('sí', 'si', 'claro', 'por supuesto');
		$this->set('botQuestion', $this->whatWeAsk);
		if (empty($this->data)) {
			$this->data['Usuario']['mail'] = $email;
			//show form
		} else {
			//already entered email
			$botcheck = $this->data['Usuario']['check'];
			//set email to passed variable if present
			if (!$email) $email = $this->data['Usuario']['mail'];
			// make sure whave email and a check
			if (!$email) {
				$this->Usuario->invalidate('mail');
			} else if (!in_array(strtolower($botcheck), $this->humanWouldType)) {
			 	$this->User->invalidate('check');
			} else {
				//email entered, check for it
				$account = $this->Usuario->findByMail($email);
				if (!$account['Usuario']['activo']) {
					//banned user, tell me where to go
					$this->Session->setFlash(__('Tu cuenta está desactivada. Actívala mediante el e-mail de activación o contacta con el administrador', true));
					$this->redirect(array('controller' => 'pages', 'action' => 'display'));
				}
				if (!isset($account['Usuario']['mail'])) {
					$this->Session->setFlash(__('Tu e-mail no se encuentra en nuestra base de datos. Regístrate en DULCISSIMAS, Models & Events', true));
					$this->redirect(array('controller' => 'pages', 'action' => 'display'));
				}
				
				$newpwd = $this->genPass(8);
				$this->data['Usuario']['resetpass'] = $newpwd;
				$this->Usuario->create();
				$this->Usuario->id = $account['Usuario']['id'];
				if($this->Usuario->save($this->data, true, array('resetpass'))){
					$this->Email->to = $account['Usuario']['mail'];
					$this->Email->bcc = array('info@dulcissimas.com');
					$this->Email->subject = 'Recuperación de contraseña. DULCISSIMAS. Models & Events';
					$this->Email->replyTo = 'info@dulcissimas.com';
					$this->Email->from = 'DULCISSIMAS. Models & Events <info@dulcissimas.com>';
					$this->Email->additionalParams = '-fwebmaster@dulcissimas.com';
					$this->Email->template = 'reset_password';
					$this->Email->sendAs = 'html';
					$this->set('user', $account);
					$this->set('pwd', $newpwd);
					$this->Email->send();
					$this->Session->setFlash(__('Te hemos mandado un e-mail con las instrucciones para recuperar tu contraseña', true));
					$this->redirect(array('controller' => 'pages', 'action' => 'display'));
				} else {
					$this->Session->setFlash(__('Ocurrió algún problema al resetear la contraseña', true));
					$this->redirect(array('controller' => 'pages', 'action' => 'display'));
				}
			}
		}
	}
	
	function newpassword($mail = null) {
		if (!$mail) {
			$this->Session->setFlash(__('Sección restringida sólo a acceso desde el correo', true));
			$this->redirect(array('controller' => 'pages', 'action' => 'display'));
		} else {
			$this->Session->setFlash(__('Por seguridad, debes cambiar la contraseña que te hemos suministrado', true));
			$this->redirect('change_password/'.$mail);
		}
	}
	
	function admin_make_vip($id=null) {
		if($id == null) {
			$this->Session->setFlash('Usuario erróneo');
			$this->redirect(array('action' => 'index'));
		}
		if($this->Usuario->UpdateAll(array('Usuario.is_vip' => true), array('Usuario.id' => $id))) {
			$this->Session->setFlash('Has convertido al usuario en nuevo Usuario Vip');
			$this->redirect(array('action' => 'index'));
		}
		$this->Session->setFlash('Ocurrió algún error al intentar convertir al usuario.');
		$this->redirect(array('action' => 'index'));
	}
	
	function admin_erase_vip($id=null) {
		if($id == null) {
			$this->Session->setFlash('Usuario erróneo');
			$this->redirect(array('action' => 'index'));
		}
		if($this->Usuario->UpdateAll(array('Usuario.is_vip' => '0'), array('Usuario.id' => $id))) {
			$this->Session->setFlash('Has convertido al Usuario Vip en nuevo usuario sin privilegios');
			$this->redirect(array('action' => 'index'));
		}
		$this->Session->setFlash('Ocurrió algún error al intentar convertir al usuario.');
		$this->redirect(array('action' => 'index'));
	}
	
	/**
	 * Contruye todo el arbol Acl para los Acos
	 * Esta funcion debe omitirse cuando la aplicacion
	 * pase a fase de produccion.
	 */
	function buildAcl() {
		$log = array();
		$aco =& $this->Acl->Aco;
		$root = $aco->node('controllers');
		if (!$root) {
			$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
			$root = $aco->save();
			$root['Aco']['id'] = $aco->id;
			$log[] = 'Creado el nodo Aco para los controladores';
		} else {
			$root = $root[0];
		}
		App::import('Core', 'File');
		$Controllers = Configure::listObjects('controller');
		$appIndex = array_search('App', $Controllers);
		if ($appIndex !== false ) {
			unset($Controllers[$appIndex]);
		}
		$baseMethods = get_class_methods('Controller');
		$baseMethods[] = 'buildAcl';
		// miramos en cada controlador en app/controllers
		foreach ($Controllers as $ctrlName) {
			App::import('Controller', $ctrlName);
			$ctrlclass = $ctrlName . 'Controller';
			$methods = get_class_methods($ctrlclass);
			//buscar / crear nodo de controlador
			$controllerNode = $aco->node('controllers/'.$ctrlName);
			if (!$controllerNode) {
				$aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName));
				$controllerNode = $aco->save();
				$controllerNode['Aco']['id'] = $aco->id;
				$log[] = 'Creado el nodo Aco del controlador '.$ctrlName;
			} else {
				$controllerNode = $controllerNode[0];
			}
			//Limpieza de los metodos, para eliminar aquellos en el controlador
			//y en las acciones privadas
			foreach ($methods as $k => $method) {
				if (strpos($method, '_', 0) === 0) {
					unset($methods[$k]);
					continue;
				}
				if (in_array($method, $baseMethods)) {
					unset($methods[$k]);
					continue;
				}
				$methodNode = $aco->node('controllers/'.$ctrlName.'/'.$method);
				if (!$methodNode) {
					$aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method));
					$methodNode = $aco->save();
					$log[] = 'Creado el nodo Aco para '. $method;
				}
			}
		}
		debug($log);
	}
	
	/**
	 * Otorga y deniega accesos entre aros y acos.
	 * Esta funcion debe desaparecer cuando la aplicacion
	 * pase a fase de produccion.
	 */
	function initDB() {
		$permiso =& $this->Usuario->Permiso;
		//Permite a los administradores hacer todo
		$permiso->id = 5;
		$this->Acl->allow($permiso, 'controllers');
		
		//Permite a los editores hacer todo menos administrar y acceder a contenido vip
		$permiso->id = 4;
		$this->Acl->allow($permiso, 'controllers');
		$this->Acl->deny($permiso, 'controllers/Admins');
		$this->Acl->deny($permiso, 'controllers/UsuarioVips');
		
		//Deniega a los usuarios vip el acceso a todo, salvo opciones de usuario y contenido vip
		$permiso->id = 3;
		$this->Acl->deny($permiso, 'controllers');
		$this->Acl->allow($permiso, 'controllers/Usuarios');
		$this->Acl->allow($permiso, 'controllers/UsuarioVips');
		
		//Deniega a los usuarios el acceso a todo, salvo opciones de usuario
		$permiso->id = 2;
		$this->Acl->deny($permiso, 'controllers');
		$this->Acl->allow($permiso, 'controllers/Usuarios');
	}
	
}
